home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / grub / grub-mkconfig_lib next >
Text File  |  2009-10-29  |  6KB  |  248 lines

  1. # Helper library for grub-mkconfig
  2. # Copyright (C) 2007,2008,2009  Free Software Foundation, Inc.
  3. #
  4. # GRUB is free software: you can redistribute it and/or modify
  5. # it under the terms of the GNU General Public License as published by
  6. # the Free Software Foundation, either version 3 of the License, or
  7. # (at your option) any later version.
  8. #
  9. # GRUB is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  16.  
  17. transform="s,x,x,"
  18.  
  19. prefix=/usr
  20. exec_prefix=${prefix}
  21. datarootdir=${prefix}/share
  22. datadir=${datarootdir}
  23. sbindir=${exec_prefix}/sbin
  24. pkgdatadir=${datadir}/`echo grub | sed "${transform}"`
  25.  
  26. grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
  27.  
  28. grub_warn ()
  29. {
  30.   echo "Warning: $@" >&2
  31. }
  32.  
  33. make_system_path_relative_to_its_root ()
  34. {
  35.   path=$1
  36.   # abort if file doesn't exist
  37.   if test -e $path ; then : ;else
  38.     return 1
  39.   fi
  40.  
  41.   # canonicalize
  42.   if path=`readlink -f $path` ; then : ; else
  43.     return 1
  44.   fi
  45.  
  46.   # if not a directory, climb up to the directory containing it
  47.   if test -d $path ; then
  48.     dir=$path
  49.   else
  50.     dir=`echo $path | sed -e "s,/[^/]*$,,g"`
  51.   fi
  52.  
  53.   num=`stat -c %d $dir`
  54.  
  55.   # this loop sets $dir to the root directory of the filesystem we're inspecting
  56.   while : ; do
  57.     parent=`readlink -f $dir/..`
  58.     if [ "x`stat -c %d $parent`" = "x$num" ] ; then : ; else
  59.       # $parent is another filesystem; we found it.
  60.       break
  61.     fi
  62.     if [ "x$dir" = "x/" ] ; then
  63.       # / is our root.
  64.       break
  65.     fi
  66.     dir=$parent
  67.   done
  68.  
  69.   # This function never prints trailing slashes (so that its output can be
  70.   # appended a slash unconditionally).  Each slash in $dir is considered a
  71.   # preceding slash, and therefore the root directory is an empty string.
  72.   if [ "$dir" = "/" ] ; then
  73.     dir=""
  74.   fi
  75.  
  76.   # XXX: This fails if $dir contains ','.
  77.   path=`echo "$path" | sed -e "s,^$dir,,g"` || return 1
  78.  
  79.   case "`uname 2>/dev/null`" in
  80.     CYGWIN*)
  81.       # Cygwin: Check if regular or emulated mount.
  82.       if [ -z "$dir" ] || [ "`stat -c %D "$dir/.."`" != 620000 ] ; then
  83.         # Reached some mount point not below /cygdrive.
  84.         # GRUB does not know Cygwin's emulated mounts,
  85.         # convert to Win32 path and remove drive letter.
  86.         path=`cygpath -m "$path" | sed -n 's,^[A-Za-z]:,,p'`
  87.         test ! -z "$path" || return 1
  88.       fi ;;
  89.   esac
  90.  
  91.   echo "$path"
  92. }
  93.  
  94. is_path_readable_by_grub ()
  95. {
  96.   path=$1
  97.  
  98.   # abort if path doesn't exist
  99.   if test -e $path ; then : ;else
  100.     return 1
  101.   fi
  102.  
  103.   # abort if file is in a filesystem we can't read
  104.   if ${grub_probe} -t fs $path > /dev/null 2>&1 ; then : ; else
  105.     return 1
  106.   fi
  107.  
  108.   return 0
  109. }
  110.  
  111. convert_system_path_to_grub_path ()
  112. {
  113.   path=$1
  114.  
  115.   grub_warn "convert_system_path_to_grub_path() is deprecated.  Use prepare_grub_to_access_device() instead."
  116.  
  117.   # abort if GRUB can't access the path
  118.   if is_path_readable_by_grub ${path} ; then : ; else
  119.     return 1
  120.   fi
  121.  
  122.   if drive=`${grub_probe} -t drive $path` ; then : ; else
  123.     return 1
  124.   fi
  125.  
  126.   if relative_path=`make_system_path_relative_to_its_root $path` ; then : ; else
  127.     return 1
  128.   fi
  129.  
  130.   echo ${drive}${relative_path}
  131. }
  132.  
  133. save_default_entry ()
  134. {
  135.   if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then
  136.     echo 'saved_entry=${chosen}'
  137.     echo 'save_env saved_entry'
  138.   fi
  139. }
  140.  
  141. prepare_grub_to_access_device ()
  142. {
  143.   device=$1
  144.  
  145.   loop_file=
  146.   case ${device} in
  147.     /dev/loop/*|/dev/loop[0-9])
  148.       loop_file=`losetup ${device} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
  149.       case $loop_file in
  150.         /dev/*) ;;
  151.         *)
  152.           loop_device=${device}
  153.           device=`${grub_probe} --target=device "${loop_file}"`
  154.         ;;
  155.       esac
  156.     ;;
  157.   esac
  158.  
  159.   # Abstraction modules aren't auto-loaded.
  160.   abstraction="`${grub_probe} --device ${device} --target=abstraction`"
  161.   for module in ${abstraction} ; do 
  162.     echo "insmod ${module}"
  163.   done
  164.  
  165.   fs="`${grub_probe} --device ${device} --target=fs`"
  166.   for module in ${fs} ; do
  167.     echo "insmod ${module}"
  168.   done
  169.  
  170.   # If there's a filesystem UUID that GRUB is capable of identifying, use it;
  171.   # otherwise set root as per value in device.map.
  172.   echo "set root=`${grub_probe} --device ${device} --target=drive`"
  173.   if fs_uuid="`${grub_probe} --device ${device} --target=fs_uuid 2> /dev/null`" ; then
  174.     echo "search --no-floppy --fs-uuid --set ${fs_uuid}"
  175.   fi
  176.  
  177.   if [ "x${loop_file}" != x ]; then
  178.     loop_mountpoint="$(awk '"'${loop_file}'" ~ "^"$2 && $2 != "/" { print $2 }' /proc/mounts | tail -n1)"
  179.     if [ "x${loop_mountpoint}" != x ]; then
  180.       echo "loopback loop0 ${loop_file#$loop_mountpoint}"
  181.       echo "set root=(loop0)"
  182.     fi
  183.   fi
  184. }
  185.  
  186. grub_file_is_not_garbage ()
  187. {
  188.   if test -f "$1" ; then
  189.     case "$1" in
  190.       *.dpkg-*) return 1 ;; # debian dpkg
  191.     esac
  192.   else
  193.     return 1
  194.   fi
  195.   return 0
  196. }
  197.  
  198. version_test_numeric ()
  199. {
  200.   local a=$1
  201.   local cmp=$2
  202.   local b=$3
  203.   if [ "$a" = "$b" ] ; then
  204.     case $cmp in
  205.       ge|eq|le) return 0 ;;
  206.       gt|lt) return 1 ;;
  207.     esac
  208.   fi
  209.   if [ "$cmp" = "lt" ] ; then
  210.     c=$a
  211.     a=$b
  212.     b=$c
  213.   fi
  214.   if (echo $a ; echo $b) | sort -n | head -n 1 | grep -qx $b ; then
  215.     return 0
  216.   else
  217.     return 1
  218.   fi
  219. }
  220.  
  221. version_test_gt ()
  222. {
  223.   local a=`echo $1 | sed -e "s/[^-]*-//;s/[._-]\(pre\|rc\|test\|git\|old\)/~\1/g"`
  224.   local b=`echo $2 | sed -e "s/[^-]*-//;s/[._-]\(pre\|rc\|test\|git\|old\)/~\1/g"`
  225.   local cmp=gt
  226.   if [ "x$b" = "x" ] ; then
  227.     return 0
  228.   fi
  229.   case $a:$b in
  230.     *.old:*.old) ;;
  231.     *.old:*) a=`echo -n $a | sed -e s/\.old$//` ; cmp=gt ;;
  232.     *:*.old) b=`echo -n $b | sed -e s/\.old$//` ; cmp=ge ;;
  233.   esac
  234.   dpkg --compare-versions "$a" $cmp "$b"
  235.   return $?
  236. }
  237.  
  238. version_find_latest ()
  239. {
  240.   local a=""
  241.   for i in $@ ; do
  242.     if version_test_gt "$i" "$a" ; then
  243.       a="$i"
  244.     fi
  245.   done
  246.   echo "$a"
  247. }
  248.